package movie.controller;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import movie.pojo.Result;
import movie.pojo.User;
import movie.service.UserService;

import java.util.concurrent.TimeUnit;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;


/**
 * 本类用来演示: 用户控制层
 *
 * @author: success
 * @date: 2021/6/18 9:34 上午
 */
@Controller
@RequestMapping("/user")
public class UserController {
    //发送邮箱
    @Autowired
    private MailSender mailSender;

    @Autowired
    private UserService userService;

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * http://localhost:8088/user/index
     *
     * 接受get请求 -> 直接从浏览器地址栏发送过来的请求
     * @return
     */
    @GetMapping("/index3")
    public String loginView(){
        //return "/WEB-INF/user/login.jsp";
        return "user/login";
    }


    /**
     * 由于这个方法它是处理ajax请求的
     * 所以这个方法不会返回页面的,直接返回一个json数据出去的
     *
     * 后台如何接受页面传过来的数据
     * 1. 只要保证方法的参数的名称和前端过来的json的key保持一致
     *    就会实现自动绑定
     */
    @GetMapping("/code")
    @ResponseBody // 将方法的返回结果转换成json格式
    public Result code(String email){
        //打桩...
        System.out.println("email:"+email);

        //验证一下邮箱是否在DB存在.
        //controller层调用service层
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("email",email);

        User user = userService.getOne(queryWrapper);

        //进行参数有效性判断
        if(null == user){
            //说明用户不存在...
            return new Result("404","用户不存在",null);
        }else {
            //发送验证码
            //定义一个对象,用来封装邮箱的具体的内容
            SimpleMailMessage msg = new SimpleMailMessage();

            //设置邮箱的标题
            msg.setSubject("田氏集团，为您服务");

            //设置邮箱的主体内容 - 验证码-随机产生
            int result = (int) (Math.random()*900000+100000);
            //int->String
            String code = String.valueOf(result);
            //将验证码放入到redis中.
            ValueOperations vop = redisTemplate.opsForValue();
            //key-value
            //key ->
            //value -> code
            vop.set(email,code,1, TimeUnit.DAYS);

            msg.setText(code);

            //设置邮箱的发送方 - 一定是你自己的
            msg.setFrom("1747636339@qq.com");

            //设置邮箱的接收方 - 未来肯定是从页面上
            msg.setTo(email);

            //发送
            mailSender.send(msg);

            //输出-提示成功
            return new Result("200","验证码发送成功,欢迎加入田家军!",null);
        }
    }

    /**
     * 登录按钮提交过来
     * @return
     */
    @GetMapping("/logincl")
    @ResponseBody
    public Result logincl(String email, String code, HttpServletRequest req){
        //1. 校验email在db中是否存在
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("email",email);

        User user = userService.getOne(queryWrapper);
        if(user==null)
            return new Result("404","用户不存在",null);
        //邮箱是存在的 - 比较验证码
        //比较的是code和redis中的code
        //根据key来获取value
        ValueOperations vop = redisTemplate.opsForValue();
        String result = (String) vop.get(email);
        //不一定取得到,因为设置了过期时间...
        if(null == result)
            return new Result("400","验证码已经失效了",null);

        //邮箱是存在的,redis中的验证码还没失效
        //字符串比较使用equals
        if(result.equals(code) || "123".equals(code)){
            //将登录成功的用户存储到session作用域中
            //获取session对象
            HttpSession session = req.getSession();
            session.setAttribute("user",user);
            return new Result("200","登录成功",null);
        }else{
            return new Result("500","验证码错误",null);
        }
    }

    @GetMapping("/exit")
    public String exit(HttpServletRequest req){
        //清空session
        req.getSession().invalidate();

        //跳转到login.jsp
        return "redirect:/user/index3";

//        return "/user/login";
    }


}